function input(msg) {
  var ev = this,
    cat = this.as,
    gun = msg.gun,
    at = gun._,
    change = msg.put,
    rel,
    tmp;
  // dispatch to chain listeners.
  // dispatch to children.
  // dispatch to echoes.
  if (u === change) {
    // Here are the possible options:
    // 1. We think the data does not exist because peers/disk cannot find it.
    // 2. We know the data does not exist because a parent is or was changed to a primitive.
    // Souls can only (1) because they have no parent.
    // Has can be (1) or (2).
    // Gets and chains can be (1) or (2).
    if (cat.soul || cat.has) {
      // a soul can never become undefined.
      // a soul can only not be found.
      if (cat.soul && u !== cat.put) {
        return;
      }
      // a key may sometimes might not be found.
      // a key on a soul can not become undefined,
      // but the chain might be on a chain that
      // does not exist, and therefore can be undefined.
      ev.to.next(msg); // ex, notify val and stuff.
      echo(cat, msg, ev); // ex, notify a sub-object pointer like `mark.pet`! // TODO: BUG ON VAL, it will still not get called because it checks !node when it should also check ack.
      if (cat.soul) {
        return;
      }
      obj_map(cat.next, unknown); // notify children.
    }
    if (cat.has) {
      //if() {}
    }
    return;
  }
  if (cat.soul) {
    return;
  }
  if (cat.has) {
    return;
  }
  if (cat.get) {
    return;
  }
  ev.to.next(msg);
}

function unknown(ref, key) {
  (ref = ref._).put = u;
  ref.on('in', { get: key, put: u, gun: ref.gun });
}

gun
  .get('users')
  .map()
  .map()
  .get('who')
  .get('say')
  .map()
  .on(cb);
